package com.example.task;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletContext;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import com.example.entity.AskersEntity;
import com.example.entity.StudentsEntity;
import com.example.service.AskersService;
import com.example.service.StudentsService;

/**
 * 定时任务：自动分配咨询师
 * @author AutoAllotZiXunTask
 *
 */
@Component
@EnableScheduling
public class AutoAllotZiXunTask {
	
	@Autowired
	public ServletContext servletContext;
	@Autowired
	public StudentsService studentService;
	@Autowired
	public AskersService askersService;
	
	@Scheduled(cron = "0 */15 * * * ?")
	public void reportCurrentByCron() {
		System.out.println("------------开始自动分配咨询师任务------------");
		
		//判断分量开关是否开启
		String isAuto = (String) servletContext.getAttribute("autoAllotAskerSwitch");
		if(isAuto !=null && isAuto.equals("off")) {
			System.out.println("分量开关已关闭，不执行自动分配，请手动分配");
			return;
		}
		
		//查询出当天已签到的咨询师（按权重从大到小排序）
		List<AskersEntity> zxsList = askersService.getConsultant();
		List<AskersEntity> zxs = new ArrayList<>();//新创建一个空的，重新排序用
		
		//查询出所以待分配的学生（按创建时间从小到大排序）
		List<StudentsEntity> xsList = studentService.getStudent();
		
		//获取学生人数和咨询师人数进行判定
		int xsNum=xsList.size();//待分配学生人数
		int zxsNum=zxsList.size();//已签到咨询师人数
		if(xsNum == 0) {
			System.out.println("没有待分配的学生");
			System.out.println("---------自动分配咨询师结束---------");
			return;
		}
		if(zxsNum == 0) {
			System.out.println("没有可用的咨询师");
			System.out.println("---------自动分配咨询师结束---------");
			return;
		}
		//获取咨询师下的学生数量
		List<Integer> xsslList = new ArrayList<>();
		for (int i = 0; i < zxsNum; i++) { //与咨询师表中的咨询师小标一一对应查出学生人数
			xsslList.add(studentService.getConsultantStudent(zxsList.get(i).getAskerId()+""));
		}
		//对咨询师的学生人数进行判定，合理分配人数
		for (int i = 1; i < xsslList.size(); i++) { //循环进行判定
			if(xsslList.get(i)<xsslList.get(0)-20) { //对咨询师学生人数判定，看其他咨询师学生人数与权限最高的差有没有达到极限
				zxs.add(zxsList.get(i)); //达到极限后将该咨询师排在第二位（在有多个时还是权限高了优先）
				
//				AskersEntity ae=zxsList.get(zxsNum-1);
//				System.out.println(ae);
//				for (int j = zxsNum-1; j > 0; j--) {
//					zxsList.get(j).setAskerId(zxsList.get(j-1).getAskerId());
//					zxsList.get(j).setAskerName(zxsList.get(j-1).getAskerName());
//					zxsList.get(j).setWeight(zxsList.get(j-1).getWeight());
//					System.out.println(j+","+zxsList);
//				}
//				System.out.println(ae);
//				zxsList.get(0).setAskerId(ae.getAskerId());
//				zxsList.get(0).setAskerName(ae.getAskerName());
//				zxsList.get(0).setWeight(ae.getWeight());
//				System.out.println(zxsList);
			}
		}
		for(int i=0;i<zxsNum;i++) { //进行人数差判定后在按权重按序排列
			int cfcs=0; //重复次数（初始为零，每次进行新的时候为零）
			for (int j = 0; j < zxs.size(); j++) { //对该咨询师进行判断是否已排序
				if(zxsList.get(i).getAskerId()==zxs.get(j).getAskerId()) { //当通过是便是已排序
					cfcs++; //已排序后重复次数赋值为1
				}
			}
			if(cfcs==0) { //进行重复次数判定，为零时是没有录入，为一时是已经录入
				zxs.add(zxsList.get(i)); //没有录入是录入
			}
		}
		//给学生分配咨询师
		
		for (int i = 0; i < xsNum; i++) { //按照没分配学生的人数进行循环
			xsList.get(i).setAskerid(zxs.get(i%zxsNum).getAskerId()+""); //给该学生分配咨询师，并将咨询师id赋予给实体类（i/zxsNum进行判定分配给那个老师）
			xsList.get(i).setZiXunName(zxs.get(i%zxsNum).getAskerName()); //给该学生分配咨询师，并将咨询师姓名赋予给实体类（i/zxsNum进行判定分配给那个老师）
			studentService.distributionConsultant(xsList.get(i)); //然后在根据实体类分配修改
			System.out.println(xsList.get(i).getName()+":"+xsList.get(i).getZiXunName());
		}
		System.out.println("---------自动分配咨询师结束---------");
	}
}
